package fr.eisti.icc.data;

import org.hibernate.annotations.Cascade;

import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

import javax.xml.bind.annotation.XmlRootElement;


import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author clion
 */
@Entity
@Table(name = "DOCUMENT")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Document implements Serializable {

    @Column(name = "type")
    String type;
    @OneToOne(cascade = {CascadeType.ALL})
    @ForeignKey(name = "id_document")
    private Document doc;
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(name = "id")
    private int id;
    @Column(name = "sujetGen")
    private String sujetGen;
    @Column(name = "titre")
    private String titre;
    @ElementCollection
    @LazyCollection(LazyCollectionOption.FALSE)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    @Column(name = "LIST_AUTEURS")
    private List<String> listAuteurs;
    @ElementCollection
    @LazyCollection(LazyCollectionOption.FALSE)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    @Column(name = "LIST_MOTS_CLES")
    private List<String> motsCles;
    @Column(name = "prixAchat")
    private double prixAchat;
    @Column(name = "resume", columnDefinition="TEXT")
    private String resume;
    @Column(name = "disponiblePourEleve")
    private boolean disponiblePourEleve;
    @Column(name = "estDisponible")
    private boolean estDisponible;
    @Column(name = "editeur")
    private String editeur;
    @Column(name = "anneePublication")
    private String anneePublication;
    @Column(name = "etat")
    private int etat; //0=excellent
    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    @JoinTable(name = "documents_lies", joinColumns = {
        @JoinColumn(name = "id_document", nullable = true, updatable = true)},
    inverseJoinColumns = {
        @JoinColumn(name = "id_doc_a_lire_avant",
        nullable = true, updatable = true)})
    private List<Document> docsALireAvant;
    @ElementCollection(fetch = FetchType.EAGER)
    @JoinTable(name = "autres_informations_document",
    joinColumns =
    @JoinColumn(name = "id"))
    @MapKeyColumn(name = "cle")
    @Column(name = "valeur")
    private Map<String, String> autresInformations;
    @Column(name = "cheminImage")
    private String cheminImage;

    public boolean accept(String mot) {
        System.out.println(this.sujetGen.contains(mot));
        if (!this.estDisponible) {
            return false;
        }
        if (this.sujetGen.contains(mot)) {
            return true;
        }
        if (this.titre.contains(mot)) {
            return true;
        }
        // if (!new Double(this.prixAchat).equals(mot) && mot!=null) return false;
        if (this.resume.contains(mot)) {
            return true;
        }
        // if (!new Boolean(this.disponiblePourEleve).equals(mot) && mot!=null) return false;

        if (this.editeur.contains(mot)) {
            return true;
        }
        if (this.anneePublication.contains(mot)) {
            return true;
        }
        //  if (!new Integer(this.etat).equals(mot) && mot!=null) return false;
        if (this.motsCles.contains(mot)) {
            return true;
        }
        if (listAuteurs.contains(mot)) {
            return true;
        }
        if (autresInformations.containsValue(mot)) {
            return true;
        }
        return false;
    }

    public boolean accept(Map<String, String> map) {
        Map<String, String> moi = new HashMap<String, String>();
        moi.put("id", id + "");
        moi.put("sujet", sujetGen + "");
        moi.put("titre", titre + "");
        moi.put("prix", prixAchat + "");
        moi.put("pourEleve", disponiblePourEleve + "");
        moi.put("disponible", estDisponible + "");
        moi.put("editeur", editeur + "");
        moi.put("etat", etat + "");
        moi.put("annee", anneePublication + "");

        for (int i = 1; i < listAuteurs.size() + 1; i++) {
            moi.put("auteur_" + i, listAuteurs.get(i - 1) + "");
        }
        for (int i = 1; i < motsCles.size() + 1; i++) {
            moi.put("mot_" + i, motsCles.get(i - 1) + "");
        }
        for (Map.Entry<String, String> entry : autresInformations.entrySet()) {
            moi.put(entry.getKey(), entry.getValue() + "");
        }
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String cle = entry.getKey();
            String valeur = entry.getValue();
            if (!moi.containsKey(cle)) {
                return false;
            }
            if (moi.get(cle).contains("_") && !valeur.contains("")) {
                String item = moi.get(cle).split("_")[1];
                int indice = 1;
                boolean found = false;
                while (moi.containsKey(item + "_" + indice) && !found) {
                    found = found || moi.get(item + "_" + indice).equals(valeur);

                    indice++;
                }
                if (!found) {
                    return false;
                }
            } else if (!moi.get(cle).equals(valeur) && !valeur.contains("")) {
                return false;
            }


        }
        return true;
    }

    public Document(String sujetGen, String titre, String auteurs, double prixAchat, String resume, String editeur, String anneePublication, int etat, String isbn) {
        this.sujetGen = sujetGen;
        this.titre = titre;
        this.listAuteurs = new ArrayList<String>();
        listAuteurs.add(auteurs);
        this.motsCles = new ArrayList<String>();
        this.prixAchat = prixAchat;
        this.resume = resume;
        this.disponiblePourEleve = true;
        this.estDisponible = true;
        this.editeur = editeur;
        this.anneePublication = anneePublication;
        this.etat = etat;
        this.docsALireAvant = new ArrayList<Document>();
        this.autresInformations = new HashMap<String, String>();
        this.autresInformations.put("isbn", isbn);
        this.type = "Livre";
    }

    public Document(String type, String sujetGen, String titre, String auteurs, double prixAchat, String resume, String editeur, String anneePublication, int etat) {
        this.sujetGen = sujetGen;
        this.titre = titre;
        this.listAuteurs = new ArrayList<String>();
        listAuteurs.add(auteurs);
        this.motsCles = new ArrayList<String>();
        this.prixAchat = prixAchat;
        this.resume = resume;
        this.disponiblePourEleve = true;
        this.estDisponible = true;
        this.editeur = editeur;
        this.anneePublication = anneePublication;
        this.etat = etat;
        this.docsALireAvant = new ArrayList<Document>();
        this.autresInformations = new HashMap<String, String>();
        this.type = type;
    }

    public Document(String sujetGen, String titre, String auteurs, double prixAchat, String resume, String editeur, String anneePublication, int etat, String version, String os, int memoire, int espaceDisque) {
        this.type = "Logiciel";
        this.sujetGen = sujetGen;
        this.titre = titre;
        this.listAuteurs = new ArrayList<String>();
        listAuteurs.add(auteurs);
        this.motsCles = new ArrayList<String>();
        this.prixAchat = prixAchat;
        this.resume = resume;
        this.disponiblePourEleve = true;
        this.estDisponible = true;
        this.editeur = editeur;
        this.anneePublication = anneePublication;
        this.etat = etat;
        this.docsALireAvant = new ArrayList<Document>();
        this.autresInformations = new HashMap<String, String>();
        this.autresInformations.put("version", version);
        this.autresInformations.put("operatingSystems_1", os + "");

        this.autresInformations.put("memoire", memoire + "");
        this.autresInformations.put("espaceDisque", espaceDisque + "");

    }

    public Document() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getSugetGen() {
        return sujetGen;
    }

    public void setSugetGen(String sugetGen) {
        this.sujetGen = sugetGen;
    }

    public String getTitre() {
        return titre;
    }

    public void setTitre(String titre) {
        this.titre = titre;
    }

    public List<String> getListAuteurs() {
        return listAuteurs;
    }

    public void setListAuteurs(List<String> listAuteurs) {
        this.listAuteurs = listAuteurs;
    }

    public List<String> getMotsCles() {
        return motsCles;
    }

    public void setMotsCles(List<String> motsCles) {
        this.motsCles = motsCles;
    }

    public double getPrixAchat() {
        return prixAchat;
    }

    public void setPrixAchat(double prixAchat) {
        this.prixAchat = prixAchat;
    }

    public String getSujetGen() {
        return sujetGen;
    }

    public void setSujetGen(String sujetGen) {
        this.sujetGen = sujetGen;
    }

    public boolean isDisponiblePourEleve() {
        return disponiblePourEleve;
    }

    public void setDisponiblePourEleve(boolean disponiblePourEleve) {
        this.disponiblePourEleve = disponiblePourEleve;
    }

    public String getResume() {
        return resume;
    }

    public void setResume(String resume) {
        this.resume = resume;
    }

    public boolean isDiponiblePourEleve() {
        return disponiblePourEleve;
    }

    public void setDiponiblePourEleve(boolean diponiblePourEleve) {
        this.disponiblePourEleve = diponiblePourEleve;
    }

    public boolean isEstDisponible() {
        return estDisponible;
    }

    public void setEstDisponible(boolean estDisponible) {
        this.estDisponible = estDisponible;
    }

    public String getEditeur() {
        return editeur;
    }

    public void setEditeur(String editeur) {
        this.editeur = editeur;
    }

    public String getAnneePublication() {
        return anneePublication;
    }

    public void setAnneePublication(String anneePublication) {
        this.anneePublication = anneePublication;
    }

    public int getEtat() {
        return etat;
    }

    public void setEtat(int etat) {
        this.etat = etat;
    }

    public List<Document> getDocsALireAvant() {
        return docsALireAvant;
    }

    public void setDocsALireAvant(List<Document> docsALireAvant) {
        this.docsALireAvant = docsALireAvant;
    }

    public Map<String, String> getAutresInformations() {
        return autresInformations;
    }

    public void setAutresInformations(Map<String, String> autresInformations) {
        this.autresInformations = autresInformations;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Document getDoc() {
        return doc;
    }

    public void setDoc(Document doc) {
        this.doc = doc;
    }

    public void addAutheur(String autheur) {
        listAuteurs.add(autheur);
    }

    public void SupprimerAutheurs() {
        listAuteurs.clear();
    }

    public void addMotCle(String mot) {
        motsCles.add(mot);
    }

    public void SupprimerMotCle() {
        motsCles.clear();
    }

    public void addDocAlireAvant(Document doc) {
        docsALireAvant.add(doc);
    }

    public void SupprimerDocAlireAvant() {
        docsALireAvant.clear();
    }

    public String getCheminImage() {
        return cheminImage;
    }

    public void setCheminImage(String cheminImage) {
        this.cheminImage = cheminImage;
    }

    public void addItem(String cle, String valeur) {
        autresInformations.put(cle, valeur);
    }

    public void removeItem(String cle) {
        autresInformations.remove(cle);
    }


    
    
}
